import Tkinter as tk 			# GUI Fenster
import socket					# Socket Server

from vec2d import vec2d			# Vektor Klasse 
from FabbiLib import onTick		# meine Funktionsklasse

'''
	Wird im "Endprodukt" nichtmehr benoetigt:
		- top 
		- canvas
		- gui 
		- draw(..)
		- drawSeg(..)

	TODO: 
		- main(..):
		 - broadcast an Clients des neuen Segments,
		 - Bewegungsaenderung abfragen
		- allgmein:
		 - player koordinaten etc setzen, wenn alle connected,
		   nicht fest vorgeben
'''

# Konstanten
HEIGHT = 400
WIDTH = 400

## SOCKET
s = socket.socket()
host = socket.gethostname()
port = 12345
s.bind((host, port))

## Server GUI
# Main Window
top = tk.Tk()
top.title("Server")
top.geometry("{0}x{1}".format(HEIGHT+10,WIDTH+10))

# Canvas
canvas = tk.Canvas(top, height=HEIGHT, width=WIDTH, bg="grey")
canvas.pack()
clients = []

# <gui> mit GUI Fenster, Canvas zum Zeichnen und den ID's der gezeichneten
# Dinge
gui = 	{
		'top': top,
		'canvas': canvas,
		'IDs': []
		}

# die Spieler mit Richtung und Koordinaten und Farbe
player = { 
		'player1': 	{'dir': vec2d(0,-1), 
					 'tron': [vec2d(WIDTH/5/3,HEIGHT/5-1),vec2d(WIDTH/5/3,HEIGHT/5-2)],
					 'col': "green"
					},
		'player2':  {'dir': vec2d(0,-1), 
					 'tron': [vec2d(WIDTH/5/3*2,HEIGHT/5-1),vec2d(WIDTH/5/3*2,HEIGHT/5-2)],
					 'col': "blue"
					},
		}

def draw(gui, player):
	'''
		zeichnet die Viecher
	'''
	can = gui['canvas']
	can.delete(*gui['IDs']) # loesche alte Segmente aus der GUI
	gui['IDs'] = []

	# Zeichne 
	for t in player.values(): # jeder Player
		col = t['col']
		# das Selbe wie eine for-schleife, die eine Liste erzeugt
		gui['IDs'] = [drawSeg(can, pix, col) for pix in t['tron']]

		pix = t['tron'][-1] # der letzte Part
		gui['IDs'].append(drawSeg(can, pix, "red"))

def drawSeg(can, pix, col):
	'''
		Zeichnet ein Segment <pix> in den canvas <can> mit Farbe <col>
	'''
	can.create_rectangle(pix[0]*5,pix[1]*5,
						(pix[0]+1)*5,(pix[1]+1)*5, fill=col)


def move(gui, player):
	'''
		Bewegt die Viecher
	'''
	for t in player.values():
		direc = t['dir']
		curHead = t['tron'][-1]
		t['tron'].append(curHead + direc) # neuer "Kopf"


def main(gui, player):
	'''
		Main Routine
	'''
	# Zeichnen
	draw(gui, player)
	# Bewegen
	move(gui, player)

# def sendToClients(clients, msg):
# 	'''
# 		sendet <msg> zu allen <clients>
# 	'''
# 	for client in clients:
# 		client.send(msg)

# ## SERVERLOGIK
# s.listen(2)
# # Wartet auf die 2 Clients
# while len(clients) < 2:
# 	c, addr = s.accept()
# 	clients.append(c)
# 	# gibt dem Client einen Namen
# 	name = str(len(clients))
# 	c.send("n: {0}".format(name))
# 	time.sleep(0.5)

# Ruft <main> alle 50ms mit Argumenten <gui> und <player> auf
onTick(main, 50, gui, player)
# Mainloop der GUI
top.mainloop()
